function tokenize(code) {
  const tokens = [];
  
  // 首先检查整个代码中是否包含中文双引号（在任何处理之前）
  for (let i = 0; i < code.length; i++) {
    const ch = code[i];
    if (ch === '“' || ch === '”') {
      const lineNumber = code.substring(0, i).split('\n').length;
      throw new Error(`错误：检测到中文双引号 "${ch}"，请使用英文双引号 """。字符串必须使用英文双引号包裹。位置：第${lineNumber}行`);
    }
  }
  
  // 先移除 // 行注释（不影响字符串内的 //）
  let cleaned = '';
  let inString = false;
  let escapeNext = false;
  for (let i = 0; i < code.length; i++) {
    const ch = code[i];
    if (inString) {
      cleaned += ch;
      if (escapeNext) {
        escapeNext = false;
      } else if (ch === '\\') {
        escapeNext = true;
      } else if (ch === '"') {
        inString = false;
      }
      continue;
    }
    // 非字符串状态，检测行注释起始
    if (ch === '"') {
      inString = true;
      cleaned += ch;
      continue;
    }
    if (ch === '/' && code[i + 1] === '/') {
      // 跳过直到行尾
      while (i < code.length && code[i] !== '\n') i++;
      cleaned += '\n'; // 保留换行
      continue;
    }
    cleaned += ch;
  }

  // 检测中文标点符号
  const chinesePunctuationMap = {
    '；': ';',  // 中文分号
    '，': ',',  // 中文逗号
    '（': '(',  // 中文左括号
    '）': ')',  // 中文右括号
    '【': '[',  // 中文左方括号
    '】': ']',  // 中文右方括号
    '｛': '{',  // 中文左花括号
    '｝': '}',  // 中文右花括号
    '《': '<',  // 中文左书名号
    '》': '>',  // 中文右书名号
    '：': ':',  // 中文冒号
    '！': '!',  // 中文感叹号
    '？': '?',  // 中文问号
    '“': '"',   // 中文左双引号
    '”': '"',   // 中文右双引号
    '＇': "'",  // 中文单引号
    '＼': '\\', // 中文反斜杠
    '｜': '|',  // 中文竖线
    '＆': '&',  // 中文与号
    '＠': '@',  // 中文艾特号
    '＃': '#',  // 中文井号
    '＄': '$',  // 中文美元号
    '％': '%',  // 中文百分号
    '＾': '^',  // 中文脱字符
    '～': '~',  // 中文波浪号
    '｀': '`',  // 中文反引号
    '－': '-',  // 中文连字符
    '＝': '=',  // 中文等号
    '＋': '+',  // 中文加号
    '＊': '*',  // 中文星号
    '／': '/',  // 中文斜杠
    '＜': '<',  // 中文小于号
    '＞': '>',  // 中文大于号
    '［': '[',  // 中文左方括号
    '］': ']'   // 中文右方括号
  };

  // 检查是否包含中文标点符号（排除字符串内容）
  const chinesePunctuationFound = [];
  let inStringForCheck = false;
  let escapeNextForCheck = false;
  
  for (let i = 0; i < cleaned.length; i++) {
    const char = cleaned[i];
    
    if (inStringForCheck) {
      // 在字符串内，跳过字符检查
      if (escapeNextForCheck) {
        escapeNextForCheck = false;
      } else if (char === '\\') {
        escapeNextForCheck = true;
      } else if (char === '"') {
        inStringForCheck = false;
      }
      continue;
    }
    
    // 非字符串状态，检查是否是字符串开始
    if (char === '"') {
      inStringForCheck = true;
      continue;
    }
    
    // 检查中文标点符号
    // 首先检查是否是中文双引号（"或"）
    if (char === '"' || char === '"') {
      const lineNumber = cleaned.substring(0, i).split('\n').length;
      chinesePunctuationFound.push({
        char: char,
        replacement: '"',
        position: i,
        line: lineNumber
      });
    } else if (chinesePunctuationMap[char]) {
      const lineNumber = cleaned.substring(0, i).split('\n').length;
      chinesePunctuationFound.push({
        char: char,
        replacement: chinesePunctuationMap[char],
        position: i,
        line: lineNumber
      });
    }
  }

  // 如果发现中文标点符号，抛出错误
  if (chinesePunctuationFound.length > 0) {
    const firstError = chinesePunctuationFound[0];
    // 针对中文双引号提供更明确的错误信息
    let errorMessage;
    if (firstError.char === '"' || firstError.char === '"') {
      errorMessage = `错误：检测到中文双引号 "${firstError.char}"，请使用英文双引号 "${firstError.replacement}"。字符串必须使用英文双引号包裹。位置：第${firstError.line}行`;
    } else {
      errorMessage = `检测到中文标点符号 "${firstError.char}"，请使用英文标点符号 "${firstError.replacement}"。位置：第${firstError.line}行`;
    }
    throw new Error(errorMessage);
  }

  // 关键字列表
  const keywords = ['int', 'double', 'main', 'for', 'if', 'return', 'wait', 'cin', 'cout', 'cinWin', 'endl', 'setprecision', 'fixed', 'scientific', 'defaultfloat', 'break', 'continue'];
  
  const regex = /\s*(".*?"|[A-Za-z_]\w*|==|!=|<=|>=|>>|<<|&&|\|\||\+\+|--|\d*\.\d+|\d+|\S)\s*/g;
  let m;
  while ((m = regex.exec(cleaned)) !== null) {
    let token = m[1];
    
    // 跳过空token和换行符
    if (!token || token.trim() === '' || token === '\n') {
      continue;
    }
    
    tokens.push(token);
  }
  return tokens;
}

export { tokenize }